public abstract class Converter {
    private int temp;

    public Converter(){}

    public void set(int val){
        this.temp = val;
    }

    public int get(){
        return this.temp;
    }

    public abstract int getSystem();

    public int validate(String mask, String num){
        if (!num.matches(mask)){
            throw new RuntimeException("Число не в текущей системе счисления");
        }
        return Integer.parseInt(num, getSystem());
    }

    public String toString(){
        return getSystem() + " " + getCurrent();
    }

    private String getCurrent() {
        switch (getSystem()) {
            case 2: return " " + Integer.toBinaryString(get());
            case 8: return " " + Integer.toOctalString(get());
            case 10: return String.valueOf(get());
            case 16: return Integer.toHexString(get()).toUpperCase();
        }
        throw new RuntimeException("Число не в текущей системе счисления");
    }

    public String print(){
        switch (getSystem()){
            case 2:{
                return 8 + "  " + Integer.toOctalString(get()) + "\n" +
                        10 + " " + get() + "\n" +
                        16 + " " + Integer.toHexString(get()).toUpperCase();
            }
            case 8:{
                return 2 + "  " + Integer.toBinaryString(get()) + "\n" +
                        10 + " " + get() + "\n" +
                        16 + " " + Integer.toHexString(get()).toUpperCase();
            }
            case 10:{
                return 2 + "  " + Integer.toBinaryString(get()) + "\n" +
                        8 + "  " + Integer.toOctalString(get()) + "\n" +
                        16 + " " + Integer.toHexString(get()).toUpperCase();
            }
            case 16:{
                return 2 + "  " + Integer.toBinaryString(get()) + "\n" +
                        8 + "  " + Integer.toOctalString(get()) + "\n" +
                        10 + " " + get();
            }
        }
        throw new RuntimeException("Число не в текущей системе счисления");
    }
    public static double Check(String regex, String input) {
        if (input.matches(regex)) {
            // Определение системы счисления по префиксу
            int radix = 10;
            if (input.startsWith("0x") || input.startsWith("0X")) {
                radix = 16; // Шестнадцатеричная система счисления
            } else if (input.startsWith("0b") ||  input.startsWith("0B")) {
                radix = 2; // Двоичная система счисления
            } else if (input.startsWith("0")) {
                radix = 8; // Восьмеричная система счисления
            }
    
            // Преобразование строки в десятичное число
            return Double.parseDouble(input, radix);
        }
    }
}

